package hihocode;

import java.util.Scanner;

public class Offer20Problem2 {

	public static void main(String[] args) {
		Offer20Problem2 object = new Offer20Problem2();
		Scanner scanner = new Scanner(System.in);
		int testCases = scanner.nextInt();
		for (int test = 1; test <= testCases; test++) {
			int cur = scanner.nextInt();
			object.findMaxContinuous(cur);
		}
		scanner.close();
	}

	//http://www.cnblogs.com/plxx/p/3995548.html
	//之前看了这篇博客，但是没有完全理解透
	//我都把公式给推出来了，假设 (M) (M + 1) (M + 2)....(M + n - 1)的相加和为num
	//则 (2M + n - 1) * n / 2 = num
	//之前我就一直想M应该是多少，遍历M求最大的n，刚开始以为M是小于sqrt(x)的，后来发现不是
	//比如 118  是28  29 30 31
	//然后我就不知道该怎么做了
	//其实(n -1)*n /2肯定是小于sqrt(num)的
	//我们遍历n，当M最小的时候就行
	//到处都是陷阱，(length - 1) * length 会溢出
	public void findMaxContinuous(long n){
		int sqrt = (int) Math.ceil(Math.sqrt(n));
		sqrt *= 2;
		long res = 1;
		for(long length = 1; length <= sqrt; length++){
			//根据上面的等式，cur = M * n
			long cur = n - (length - 1) * length / 2;
			if(cur > 0 && (cur % length == 0)){
				//找到符合条件的
				//取最大的length
				res = Math.max(res, length);
			}
		}
		System.out.println(res);
	}
	
	//显然这个是O(n)d，超时的
	public void findContinuous(int n) {
		
		int begin = 1, end = 2; // begin和end分别代表和为n的连续正数的区间
		int middle = (n + 1) / 2; // middle表示n的中间数，middle*2 >=
									// n，所以控制begin<middle即可
		int sum = begin + end;

		boolean find = false;
		while (begin < middle) {
			// 和与n相等，则打印
			if (sum == n) {
				find = true;
				System.out.println(end - begin + 1);
				// 从begin+1开始重新计算sum的值
				begin++;
				end = begin + 1;
				sum = begin + end;
				break;
			} else if (sum > n) {
				// 如果sum>n，那么begin右移，即减去最左边的数
				sum -= begin;
				begin++;
			} else {
				// 如果sum<n，那么end右移，即添加一个数
				end++;
				sum += end;
			}
		}
		if(!find){
			System.out.println(1);
		}
	}
}
